--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
tests/backend/test_interface_module_store.py b960db2e8bf87b96c14f6421402a16798d7a9ded (b960db2e) Text, 3.16 KB
T8b949e# SPDX-License-Identifier: 0BSD
Tff7b72import T7ee787os
Tff7b72import T7ee787pytest
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787interface_module_store Tff7b72import Tb4b4b4(
Te6edf3delete_interface_moduleTb4b4b4,
Te6edf3install_interface_moduleTb4b4b4,
Te6edf3list_interface_modulesTb4b4b4,
Te6edf3sanitize_interface_module_stemTb4b4b4,
Te6edf3validate_interface_module_sourceTb4b4b4,
Tb4b4b4)
Te6edf3_VALID_SRC Tff7b72= Ta5d6ffbTa5d6ff"""Ta5d6ff# example
Ta5d6ffclass ExampleInterface:
Ta5d6ff pass
Ta5d6ffinterface_class = ExampleInterface
Ta5d6ff"""
Tff7b72def Td2a8fftest_sanitize_interface_module_stemTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72assert Te6edf3sanitize_interface_module_stemTb4b4b4(Ta5d6ff"Ta5d6ffWeaveInterface.pyTa5d6ff"Tb4b4b4) Tff7b72== Ta5d6ff"Ta5d6ffWeaveInterfaceTa5d6ff"
Tff7b72assert Te6edf3sanitize_interface_module_stemTb4b4b4(Ta5d6ff"Ta5d6ffWeaveInterfaceTa5d6ff"Tb4b4b4) Tff7b72== Ta5d6ff"Ta5d6ffWeaveInterfaceTa5d6ff"
Tff7b72assert Te6edf3sanitize_interface_module_stemTb4b4b4(Ta5d6ff"Ta5d6ff../evil.pyTa5d6ff"Tb4b4b4) Tff7b72is Tff7b72None
Tff7b72assert Te6edf3sanitize_interface_module_stemTb4b4b4(Ta5d6ff"Ta5d6ffbad-name.pyTa5d6ff"Tb4b4b4) Tff7b72is Tff7b72None
Tff7b72assert Te6edf3sanitize_interface_module_stemTb4b4b4(Ta5d6ff"Ta5d6ff"Tb4b4b4) Tff7b72is Tff7b72None
Tff7b72def Td2a8fftest_validate_interface_module_source_requires_interface_classTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72assert Te6edf3validate_interface_module_sourceTb4b4b4(Ta5d6ffbTa5d6ff"Ta5d6ffclass Foo: passTa5d6ff"Tb4b4b4) Tff7b72is Tff7b72not Tff7b72None
Tff7b72assert Te6edf3validate_interface_module_sourceTb4b4b4(Te6edf3_VALID_SRCTb4b4b4) Tff7b72is Tff7b72None
Tff7b72assert Te6edf3validate_interface_module_sourceTb4b4b4(Ta5d6ffbTa5d6ff"Ta5d6ff"Tb4b4b4) Tff7b72is Tff7b72not Tff7b72None
Tff7b72assert Te6edf3validate_interface_module_sourceTb4b4b4(Ta5d6ffbTa5d6ff"Tffea00\x00Ta5d6ffinterface_classTa5d6ff"Tb4b4b4) Tff7b72is Tff7b72not Tff7b72None
Tff7b72def Td2a8fftest_install_list_delete_interface_moduleTb4b4b4(Te6edf3tmp_pathTb4b4b4)Tb4b4b4:
Te6edf3config_dir Tff7b72= Te6edf3tmp_path Tff7b72/ Ta5d6ff"Ta5d6ffreticulumTa5d6ff"
Te6edf3config_dirTff7b72.Td2a8ffmkdirTb4b4b4(Tb4b4b4)
Te6edf3result Tff7b72= Te6edf3install_interface_moduleTb4b4b4(
Tffa657strTb4b4b4(Te6edf3config_dirTb4b4b4)Tb4b4b4,
Te6edf3filenameTff7b72=Ta5d6ff"Ta5d6ffExampleInterface.pyTa5d6ff"Tb4b4b4,
Te6edf3dataTff7b72=Te6edf3_VALID_SRCTb4b4b4,
Tb4b4b4)
Tff7b72assert Te6edf3resultTb4b4b4[Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffExampleInterfaceTa5d6ff"
Tff7b72assert Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3resultTb4b4b4[Ta5d6ff"Ta5d6ffpathTa5d6ff"Tb4b4b4]Tb4b4b4)
Te6edf3listed Tff7b72= Te6edf3list_interface_modulesTb4b4b4(Tffa657strTb4b4b4(Te6edf3config_dirTb4b4b4)Tb4b4b4)
Tff7b72assert Te6edf3listedTb4b4b4[Ta5d6ff"Ta5d6ffinterfacepathTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffendswithTb4b4b4(Ta5d6ff"Ta5d6ffinterfacesTa5d6ff"Tb4b4b4)
Tff7b72assert Tffa657anyTb4b4b4(Te6edf3mTb4b4b4[Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffExampleInterfaceTa5d6ff" Tff7b72for Te6edf3m Tff7b72in Te6edf3listedTb4b4b4[Ta5d6ff"Ta5d6ffmodulesTa5d6ff"Tb4b4b4]Tb4b4b4)
Tff7b72with Te6edf3pytestTff7b72.Td2a8ffraisesTb4b4b4(Tf85149ValueErrorTb4b4b4, Te6edf3matchTff7b72=Ta5d6ff"Ta5d6ffalready existsTa5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3install_interface_moduleTb4b4b4(
Tffa657strTb4b4b4(Te6edf3config_dirTb4b4b4)Tb4b4b4,
Te6edf3filenameTff7b72=Ta5d6ff"Ta5d6ffExampleInterface.pyTa5d6ff"Tb4b4b4,
Te6edf3dataTff7b72=Te6edf3_VALID_SRCTb4b4b4,
Te6edf3overwriteTff7b72=Tff7b72FalseTb4b4b4,
Tb4b4b4)
Te6edf3install_interface_moduleTb4b4b4(
Tffa657strTb4b4b4(Te6edf3config_dirTb4b4b4)Tb4b4b4,
Te6edf3filenameTff7b72=Ta5d6ff"Ta5d6ffExampleInterface.pyTa5d6ff"Tb4b4b4,
Te6edf3dataTff7b72=Te6edf3_VALID_SRC Tff7b72+ Ta5d6ffbTa5d6ff"Tffea00\nTa5d6ff# updatedTffea00\nTa5d6ff"Tb4b4b4,
Te6edf3overwriteTff7b72=Tff7b72TrueTb4b4b4,
Tb4b4b4)
Te6edf3deleted Tff7b72= Te6edf3delete_interface_moduleTb4b4b4(Tffa657strTb4b4b4(Te6edf3config_dirTb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6ffExampleInterfaceTa5d6ff"Tb4b4b4)
Tff7b72assert Te6edf3deletedTb4b4b4[Ta5d6ff"Ta5d6fffilenameTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffExampleInterface.pyTa5d6ff"
Tff7b72assert Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffexistsTb4b4b4(
Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Tffa657strTb4b4b4(Te6edf3config_dirTb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6ffinterfacesTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffExampleInterface.pyTa5d6ff"Tb4b4b4)
Tb4b4b4)
Tff7b72def Td2a8fftest_ensure_bundled_interface_modules_installs_http_interfaceTb4b4b4(Te6edf3tmp_pathTb4b4b4)Tb4b4b4:
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787interface_module_store Tff7b72import Tb4b4b4(
Te6edf3ensure_bundled_interface_modulesTb4b4b4,
Te6edf3resolve_bundled_interface_module_pathTb4b4b4,
Tb4b4b4)
Te6edf3source Tff7b72= Te6edf3resolve_bundled_interface_module_pathTb4b4b4(Ta5d6ff"Ta5d6ffHTTPInterface.pyTa5d6ff"Tb4b4b4)
Tff7b72assert Te6edf3source Tff7b72is Tff7b72not Tff7b72None
Tff7b72assert Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3sourceTb4b4b4)
Te6edf3config_dir Tff7b72= Te6edf3tmp_path Tff7b72/ Ta5d6ff"Ta5d6ffreticulumTa5d6ff"
Te6edf3config_dirTff7b72.Td2a8ffmkdirTb4b4b4(Tb4b4b4)
Te6edf3written Tff7b72= Te6edf3ensure_bundled_interface_modulesTb4b4b4(Tffa657strTb4b4b4(Te6edf3config_dirTb4b4b4)Tb4b4b4)
Tff7b72assert Te6edf3written
Tff7b72assert Te6edf3writtenTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffHTTPInterfaceTa5d6ff"
Te6edf3target Tff7b72= Te6edf3config_dir Tff7b72/ Ta5d6ff"Ta5d6ffinterfacesTa5d6ff" Tff7b72/ Ta5d6ff"Ta5d6ffHTTPInterface.pyTa5d6ff"
Tff7b72assert Te6edf3targetTff7b72.Td2a8ffis_fileTb4b4b4(Tb4b4b4)
Tff7b72with Tffa657openTb4b4b4(Te6edf3sourceTb4b4b4, Ta5d6ff"Ta5d6ffrbTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3handleTb4b4b4:
Te6edf3expected Tff7b72= Te6edf3handleTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4)
Tff7b72assert Te6edf3targetTff7b72.Td2a8ffread_bytesTb4b4b4(Tb4b4b4) Tff7b72== Te6edf3expected
Te6edf3again Tff7b72= Te6edf3ensure_bundled_interface_modulesTb4b4b4(Tffa657strTb4b4b4(Te6edf3config_dirTb4b4b4)Tb4b4b4)
Tff7b72assert Te6edf3again Tff7b72== Tb4b4b4[Tb4b4b4]
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────